package com.itheima.day20.demo01_exception;

/*
    递归:
        概述:
            方法自己调用自己, 就叫递归.
        技巧:
            1. 找出口.
            2. 找规律.
        注意事项:
            1. 递归必须有出口, 否则容易造成: 栈内存溢出错误.
            2. 递归不能调用次数过多, 否则容易造成: 栈内存溢出错误.
            3. 构造方法不能递归调用.
        案例:
            1. 求阶乘.
            2. 打印文件目录.
            3. 删除文件夹.
            3. 复制文件夹.
            4. 创建文件夹
 */
public class Demo03 {
    public static void main(String[] args) {
        System.out.println(factorial(5));
    }

    //递归入门案例
    static int count = 0;

    public static void show() {
        System.out.println("方法执行第: " + count++ + " 次");
        //递归
        show();
    }

    /*
        推理:
            5! = 5 * 4 * 3 * 2 * 1 = 5 * 4!
            4! = 4 * 3 * 2 * 1     = 4 * 3!
            3! = 3 * 2 * 1         = 3 * 2!
            2! = 2 * 1             = 2 * 1!
            1! = 1 * 1             = 1
        结论:
            出口:  1! = 1
            规律:  n! = n * (n - 1)!
     */
    public static int factorial(int n) {
       /* //出口
        if (n == 1)
            return 1;
        //规律
        return n  * factorial(n - 1);
*/
        //简写版
        return (n == 1) ? 1 : n * factorial(n - 1);
    }
}
